<?php

class EmployeesController extends AppController {
	var $name = 'Employees';
	var $components = array ('Pagination','Upload');
	var $helpers = array('Html','Form','Accessibility','Pagination', 'Associations','Ajax','Input');

	function index() {
		$title = 'Funcionários';
		$this->set('title', $title);
		$this->set('pageTitle', $title);

		$conditions = array();
		$organizationsConditions = array();
		$unitConditions = array();

		// Permissao: se pode visualizar todas as unidades
		$group = $this->othAuth->getData('group');
		$level =$group['level'];
		$unitUser = $this->othAuth->getData('unit');

		// Filter for present only employee from an organization
		$where = '';
		if ($level < 100) {  // system admin
			$where .= '';
		} elseif ($level < 200) {
			$where .= ' AND Unit.organization_id ='.$unitUser['0']['Organization']['id'];
		} elseif ($level < 300) {
			$where .= ' AND ( 0';
			foreach($unitUser as $unitUser_i) {
				$where .= ' OR Unit.id = '.$unitUser_i['id'];

			}
			$where .= ')';
		}

		// Filter for present only employee from an organization
		$employees = $this->Employee->query(
			'SELECT DISTINCT Employee.id, User.name, User.id'.
			' FROM employees as Employee'.
			' INNER JOIN users as User ON Employee.user_id = User.id'.
			' INNER JOIN units_users as UnitUser ON User.id = UnitUser.user_id'.
			' INNER JOIN units as Unit ON UnitUser.unit_id = Unit.id'.
			' WHERE 1 = 1 '.$where
		);
		$employees_count = count($employees);
		for ($i=0; $i<$employees_count; $i++) {
			if (isset($employees[$i]['User'])) {
				$user = $this->Employee->User->findById($employees[$i]['User']['id']);

				$employees[$i]['User'] = $user['User'];
				$employees[$i]['User']['Unit'] = $user['Unit'];
				$employees[$i]['User']['Group'] = $user['Group'];
			}

		}
		$this->set('employees', $employees);
	}

	function view( $id=null ) {
		if (!$id) $this->redirect('/employees');

		$title = 'Visualizar funcionário';
		$this->set('title', $title);
		$this->set('pageTitle', $title);

		$this->Employee->id = $id;
		
		//TODO: melhorar isto
		$this->Employee->recursive = 3;
		$employee = $this->Employee->read();
		
		//pr($employee);
		$this->set('employee', $employee);
		
	}

	function add() {
		$title = 'Cadastrar funcionário';
		$this->set('title', $title);
		$this->set('pageTitle', $title);

		// Gerando lista de cidades
		$this->set('estados', $this->Employee->User->Cidade->Estado->find('list', array('fields'=>array('id','nome'))));
		// Gerando lista das entidades
		$this->set('organizations', $this->Employee->User->Unit->Organization->find('list'));

		$conditions = array();

		// Gerando lista de Unidades da Entidade
		// Permissao: se pode visualizar todas as unidades
		$unitUser = $this->othAuth->getData('unit');
		$group = $this->othAuth->getData('group');
		$level =$group['level'];
		if ($level <100) {
			$units = null;
		} else if ($level < 200) {
			$conditions[] = array("organization_id"=>$unitUser[0]['Organization']['id']);
			$units = $this->Employee->User->Unit->find('list',	array('conditions'=>$conditions, 'fields'=>array('id','nome')));
		} else if ($level < 300) {
			$units = array();
			foreach ($unitUser as $unit) {
				$units[$unit['id']] = $unit['nome'];
			}
		}
		$this->set('units',$units);
		// Carregando a lista de grupos de permissoes
		$conditions = array();
		$conditions[] = array("level >="=>$group["level"]);
		$groups = $this->Employee->User->Group->find('list', array('conditions'=>$conditions));
		$this->set('groups',$groups);

		if (!empty($this->data)) {
			// Preparando os dados de usuario

			// Validacao
			if($this->data["User"]["name"] == null) {
				$_SESSION['mensagem']['error'][] = 'O campo Nome é obrigatório.';
			}
			if(!isset($this->data['Unit']))	{
				$_SESSION['mensagem']['error'][] = 'Selecione pelo menos uma unidade.';
			}
			if($this->data["User"]["username"] == null) {
				$_SESSION['mensagem']['error'][] = 'O campo Nome de Usuário é obrigatório.';
			}
			if($this->data["User"]["passwd1"]  == null) {
				$_SESSION['mensagem']['error'][] = 'O campo Senha é obrigatório.';
			}
			if($this->data["User"]["passwd2"]  == null) {
				$_SESSION['mensagem']['error'][] = 'O campo Confirmar Senha é obrigatório.';
			}
			if($this->data["User"]["group_id"]  == null) {
				$_SESSION['mensagem']['error'][] = 'O campo Grupo é obrigatório.';
			}
			if($this->data["User"]["passwd1"]  != $this->data["User"]["passwd2"]) {
				$_SESSION['mensagem']['error'][] = 'As senhas devem ser iguais.';
			}

			if (isset($_SESSION['mensagem']['error'])) {
				return;
			}


			$this->data['User']['active'] = '1';
			if (!empty($this->data['User']['passwd1'])) {
				$this->data['User']['passwd'] = $this->othAuth->crypto($this->data['User']['passwd1']);
			}
			unset($this->data['User']['passwd1']);
			unset($this->data['User']['passwd2']);

			// Salvando o usuario
			if ($this->Employee->User->save($this->data['User'])) {

				if (!$this->Employee->User->save($this->data['Unit'])) {
					$_SESSION['mensagem']['error'][] = 'Erro ao tentar salvar as unidades do usuario.';
				}

				$user_id = $this->Employee->User->getLastInsertId();
				$this->data['Employee']['user_id'] = $user_id;

				// Salvando o employee
				if ($this->Employee->save($this->data)) {

					$employee_id = $this->Employee->getLastInsertId();
					// Se tiver uma foto para fazer upload
					$photo = $this->params["data"]["Employee"]["photo"];
					if($photo["size"]>0){
						$fileData = fread(fopen($photo["tmp_name"],"r"),$photo["size"]);
						$this->params["data"]["User"]["photo"] = $fileData;
					}else{
						$this->params["data"]["User"]["photo"] = null;
					}

					if(!$this->Employee->User->save($this->params["data"])){
						$_SESSION['mensagem']['error'][] = 'Erro ao tentar salvar a foto.';
					}

					$_SESSION['mensagem']['success'][] = 'funcionário cadastrado com sucesso!';
					$this->redirect('/employees/view/'.$this->Employee->getLastInsertId());
				} else {
					$_SESSION['mensagem']['error'][] = 'Erro ao tentar cadastrar o funcionário.';
				}
			}
			else {
				$_SESSION['mensagem']['error'][] = 'Erro ao tentar cadastrar o funcionário.';
			}
			$this->redirect('/employees');
		}
	}
	

	function add_cadastro($id=null, $hash=null) {
		if ($id != null) {
			$organization = $this->Employee->User->Unit->Organization->find("first", array('conditions' => array('Organization.id' => $id)));
			$alias = $organization['Organization']['alias'];
			$hash_cmp = md5(strrev($alias));
			if (strcmp($hash, $hash_cmp) == 0) {
				
				$link = "/employees/add_cadastro/".$id."/".$hash;

				$this->set("organization_id", $id);
				$this->set('link', $link);

				$title = 'Cadastrar funcionário';
				$this->set('title', $title);
				$this->set('pageTitle', $title);
		
				// Gerando lista de cidades
				$this->set('estados', $this->Employee->User->Cidade->Estado->find('list', array('fields'=>array('id','nome'))));
				// Gerando lista das entidades
				//$this->set('organizations', $this->Employee->User->Unit->Organization->find('list'));
		
				$conditions = array();
				$conditions[] = array("organization_id"=>$id);
				$unit = $this->Employee->User->Unit->find('first',array('conditions'=>$conditions, 'fields'=>array('id','nome')));
				
				$this->set('unit',$unit);
				$this->set('organization',$organization);

				// Carregando a lista de grupos de permissoes
				//$conditions = array();
				$groups = $this->Employee->User->Group->find('list');
				$this->set('groups',$groups);
				
				if (!empty($this->data)) {
					// Preparando os dados de usuario
		
					// Validacao
					if($this->data["User"]["name"] == null) {
						$_SESSION['mensagem']['error'][] = 'O campo Nome é obrigatório.';
					}
					if($this->data["User"]["username"] == null) {
						$_SESSION['mensagem']['error'][] = 'O campo Nome de Usuário é obrigatório.';
					}
					if($this->data["User"]["passwd1"]  == null) {
						$_SESSION['mensagem']['error'][] = 'O campo Senha é obrigatório.';
					}
					if($this->data["User"]["passwd2"]  == null) {
						$_SESSION['mensagem']['error'][] = 'O campo Confirmar Senha é obrigatório.';
					}
					if($this->data["User"]["group_id"]  == null) {
						$_SESSION['mensagem']['error'][] = 'O campo Grupo é obrigatório.';
					}
					if($this->data["User"]["passwd1"]  != $this->data["User"]["passwd2"]) {
						$_SESSION['mensagem']['error'][] = 'As senhas devem ser iguais.';
					}
		
					if (isset($_SESSION['mensagem']['error'])) {
						return;
					}
		
		
					$this->data['User']['active'] = '1';
					if (!empty($this->data['User']['passwd1'])) {
						$this->data['User']['passwd'] = $this->othAuth->crypto($this->data['User']['passwd1']);
					}
					unset($this->data['User']['passwd1']);
					unset($this->data['User']['passwd2']);
				
					$this->data['Unit'] = array('Unit'=>array('0'=>$unit['Unit']['id']));

					// Salvando o usuario
					if ($this->Employee->User->save($this->data['User'])) {
		
						//$this->data['Unit'] = array('Unit'=>array('0'=>$unit['Unit']['id']));
	
						if (!$this->Employee->User->save($this->data['Unit'])) {
							$_SESSION['mensagem']['error'][] = 'Erro ao tentar salvar as unidades do usuario.';
						}
		
						$user_id = $this->Employee->User->getLastInsertId();
						$this->data['Employee']['user_id'] = $user_id;
		
						// Salvando o employee
						if ($this->Employee->save($this->data)) {
		
							$employee_id = $this->Employee->getLastInsertId();
							// Se tiver uma foto para fazer upload
							$photo = $this->params["data"]["Employee"]["photo"];
							if($photo["size"]>0){
								$fileData = fread(fopen($photo["tmp_name"],"r"),$photo["size"]);
								$this->params["data"]["User"]["photo"] = $fileData;
							}else{
								$this->params["data"]["User"]["photo"] = null;
							}
		
							if(!$this->Employee->User->save($this->params["data"])){
								$_SESSION['mensagem']['error'][] = 'Erro ao tentar salvar a foto.';
							}
		
							$_SESSION['mensagem']['success'][] = 'funcionário cadastrado com sucesso!';
							$this->redirect('/employees/add_cadastro/'.$this->Employee->getLastInsertId());
						} else {
							$_SESSION['mensagem']['error'][] = 'Erro ao tentar cadastrar o funcionário.';
						}
					}
					else {
						$_SESSION['mensagem']['error'][] = 'Erro ao tentar cadastrar o funcionário.';
					}
					//$this->redirect('/employees');
				}
				
			} else {
				$this->set("status", "ok");
				//$this->redirect('/');
			} 
			// verificar se usuario ja esta cadastrado
			
		} else {
			$this->redirect('/');
		}
		

	}
	
	
	

	function edit( $id=null) {
		if (!$id) $this->redirect('/employees');

		$title = 'Editar funcionário';
		$this->set('title', $title);
		$this->set('pageTitle', $title);

		// Gerando lista de cidades
		$this->set('cidades', $this->Employee->Cidade->find('list'));
		$this->set('organizations', $this->Employee->User->Unit->Organization->find('list'));

		// Gerando lista de Unidades da Entidade
		// Permissao: se pode visualizar todas as unidades
		$unitUser = $this->othAuth->getData('unit');
		$group = $this->othAuth->getData('group');
		$level =$group['level'];
		if ($level <100) {
			$units = null;
		} else if ($level < 200) {
			$conditions[] = array("organization_id"=>$unitUser[0]['Organization']['id']);
			$units = $this->Employee->User->Unit->find('list',	array('conditions'=>$conditions, 'fields'=>array('id','nome')));
		} else if ($level < 300) {
			$units = array();
			foreach ($unitUser as $unit) {
				$units[$unit['id']] = $unit['nome'];
			}
		}
		$this->set('units',$units);

		// Carregando a lista de grupos de permissoes
		$conditions = array();
		$conditions[] = array("level >="=>$group["level"]);
		$groups = $this->Employee->User->Group->find('list', array('conditions'=>$conditions));
		$this->set('groups',$groups);

		$this->Employee->id = $id;

		if (empty($this->data)) {
			$this->data = $this->Employee->read();
		} else {
			// Validacao
			if($this->data["User"]["name"] == null) {
				$_SESSION['mensagem']['error'][] = 'O campo Nome é obrigatório.';
			}
			if(!isset($this->data['Unit']))	{
				$_SESSION['mensagem']['error'][] = 'Selecione pelo menos uma unidade.';
			}
			if($this->data["User"]["username"] == null) {
				$_SESSION['mensagem']['error'][] = 'O campo Nome de Usuário é obrigatório.';
			}
			if($this->data["User"]["group_id"]  == null) {
				$_SESSION['mensagem']['error'][] = 'O campo Grupo é obrigatório.';
			}
			if($this->data["User"]["passwd1"]  != $this->data["User"]["passwd2"]) {
				$_SESSION['mensagem']['error'][] = 'As senhas devem ser iguais.';
			}

			$this->data['User']['active'] = '1';
			if (!empty($this->data['User']['passwd1'])) {
				$this->data['User']['passwd'] = $this->othAuth->crypto($this->data['User']['passwd1']);
			}
			unset($this->data['User']['passwd1']);
			unset($this->data['User']['passwd2']);

			if (!isset($_SESSION['mensagem']['error'])) {
				if ($this->Employee->User->save($this->data['User'])) {
	
					if (!$this->Employee->User->save($this->data['Unit'])) {
						$_SESSION['mensagem']['error'][] = 'Erro ao tentar salvar as unidades do usuario.';
					}
	
					if ($this->data['Employee']['photo']['size']!=0) {
						$this->data['Employee']['fotoname'] = $this->data['Employee']['photo']['name'];
					}
	
					if ($this->Employee->save($this->data['Employee'])) {
						// Faz o upload da foto para o banco de dados
						$photo = $this->params["data"]["Employee"]["photo"];
						if($photo["size"]>0){
							$fileData = fread(fopen($photo["tmp_name"],"r"),$photo["size"]);
							$this->params["data"]["User"]["photo"] = $fileData;
						}else{
							unset($this->params["data"]["User"]["photo"]);
						}
	
						if(!$this->Employee->User->save($this->params["data"])){
							$_SESSION['mensagem']['error'][] = 'Erro ao tentar salvar a foto.';
						}
	
						$_SESSION['mensagem']['success'][] = 'Funcionário alterado com sucesso!';
						$this->redirect('/employees/view/'.$id);
					} else {
						$_SESSION['mensagem']['error'][] = 'Erro ao tentar alterar o Funcionário.';
					}
				} else {
						$_SESSION['mensagem']['error'][] = 'Erro ao tentar alterar o Funcionário.';
				}
			}
		}
		$employee = $this->Employee->find(array('`Employee`.id' => $id));
		$this->set('employee', $employee);

		// Carregar unidades depois de carregar os dados
		$conditions = array();
		// Gerando lista de Unidades da Entidade
		// Permissao: se pode visualizar todas as unidades
		$unitUser = $this->othAuth->getData('unit');
		$group = $this->othAuth->getData('group');
		$level =$group['level'];
		if ($level < 100) {
			$conditions[] = array("organization_id"=>$employee['User']['Unit'][0]['organization_id']);
			$units = $this->Employee->User->Unit->find('list',	array('conditions'=>$conditions, 'fields'=>array('id','nome')));
		} else if ($level < 200) {
			$conditions[] = array("organization_id"=>$unitUser[0]['Organization']['id']);
			$units = $this->Employee->User->Unit->find('list',	array('conditions'=>$conditions, 'fields'=>array('id','nome')));
		} else if ($level < 300) {
			$units = array();
			foreach ($unitUser as $unit) {
				$units[$unit['id']] = $unit['nome'];
			}
		}
		$this->set('units',$units);

		/* Estado */
		$conditions = array();
		$estado_selected = null;
		if (!empty($this->data['User']['cidade_id'])) {
			$estado_selected = $this->data['User']['Cidade']['estado_id'];
			$conditions[] = array('estado_id'=>$estado_selected);
		}
		$this->set('cidades', $this->Employee->User->Cidade->find('list', array('conditions'=>$conditions, 'fields'=>array('id','nome'))));
		$this->set('estados', $this->Employee->User->Cidade->Estado->find('list', array('fields'=>array('id','nome'))));
		$this->set('estado_selected',$estado_selected);

		if (isset($_SESSION['mensagem']['error'])) {
			return;
		}
	}

	function delete($id) {
		if (!$id) $this->redirect('/employees');

		$this->Employee->id = $id;
		$employee = $this->Employee->read();

		// Encontrando o usuario referente ao employee sendo excluido
		if (!$this->Employee->User->del($employee['User']['id'])) {
			$_SESSION['mensagem']['error'][] = 'Erro ao tentar excluir o usuario do Employee.';
		}

		// Removendo employee do sistema
		if ($this->Employee->del($id)) {
			$_SESSION['mensagem']['success'][] = 'Employee excluido com sucesso!';
		} else {
			$_SESSION['mensagem']['error'][] = 'Erro ao tentar excluir o Employee.';
		}

		// Redirencionando para o indice
		$this->redirect('/employees');
	}

	function unidadesAjax() {
		$id = $this->params['data']['Employee']['organization'];
		$conditions[] = array('organization_id'=>$id);
		$units = $this->Employee->User->Unit->find('list', array('conditions'=>$conditions, 'fields'=>array('id','nome')));
		$this->set('units', $units);
	}
}
